download data¶

In [1]:
! curl \
    --header 'Host: data.gov.ua' \
    --user-agent 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:108.0) Gecko/20100101 Firefox/108.0' \
    --header 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' \
    --header 'Accept-Language: en-US,en;q=0.5' \
    --referer 'https://data.gov.ua/dataset/470196d3-4e7a-46b0-8c0c-883b74ac65f0' \
    --cookie '_ga=GA1.3.2116747368.1671616277; _gid=GA1.3.145106975.1673376918; _gat=1' \
    --header 'Upgrade-Insecure-Requests: 1' \
    --header 'Sec-Fetch-Dest: document' \
    --header 'Sec-Fetch-Mode: navigate' \
    --header 'Sec-Fetch-Site: same-origin' \
    --header 'Sec-Fetch-User: ?1' 'https://data.gov.ua/dataset/8851831d-b5ce-4ca8-8685-eafbc3f57eca/resource/6cfff17e-84ac-4141-b0fd-89abb68e9f31/download/mvswantedbezvesti_1.json' \
    --output 'data/mvswantedbezvesti_1.json'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 18.5M  100 18.5M    0     0  1381k      0  0:00:13  0:00:13 --:--:-- 1376k
In [1]:
! tree --gitignore --dirsfirst -C
.
├── data
│   ├── area_info.csv
│   ├── broken.csv
│   ├── mvswantedbezvesti_1.json
│   └── mvswantedbezvesti_1.json.csv
├── index.html
├── project.ipynb
└── requirements.txt

1 directory, 7 files
In [2]:
! cat requirements.txt
altair==4.2.0
pandas==1.5.2

Pipeline¶

In [3]:
import datetime
import json

import altair as alt
import pandas as pd

alt.data_transformers.disable_max_rows()
Out[3]:
DataTransformerRegistry.enable('default')

Get Data¶

Load data¶

In [4]:
with open("data/mvswantedbezvesti_1.json") as f:
    data = json.load(f)
df = pd.DataFrame.from_dict(data)
df.to_csv("data/mvswantedbezvesti_1.json.csv", sep="|", index=False,)
print(df.shape)
df.head()
(26064, 20)
Out[4]:
ID OVD CATEGORY FIRST_NAME_U LAST_NAME_U MIDDLE_NAME_U FIRST_NAME_R LAST_NAME_R MIDDLE_NAME_R FIRST_NAME_E LAST_NAME_E MIDDLE_NAME_E BIRTH_DATE SEX LOST_DATE LOST_PLACE ARTICLE_CRIM RESTRAINT CONTACT PHOTOID
0 12280824 ЧЕЧЕЛІВСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ДНІПРОВСЬКОГО В... БЕЗВІСНО ЗНИКЛИЙ НАТАЛІЯ БОЙКО СЕРГІЇВНА НАТАЛЬЯ БОЙКО СЕРГЕЕВНА NATALIYA BOIKO SERHIIVNA 1984-10-22T00:00:00 ЖІНОЧА 2000-11-20T00:00:00 ДНЕПРОПЕТРОВСКАЯ, КРАСНОГВАРДЕЙСКИЙ, ДНЕПРОПЕТ... СТ.115 Ч.1 , 056-7708234,056-7700634 00405597
1 12280698 П'ЯТИХАТСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ЖОВТОВОДСЬКОГО... БЕЗВІСНО ЗНИКЛИЙ ВІКТОР ГЛАГОВСЬКИЙ ТАДЄЄВІЧ ВИКТОР ГЛАГОВСКИЙ ТАДЕЕВИЧ VIKTOR HLAHOVSKYI TADIEIEVICH 1974-08-21T00:00:00 ЧОЛОВІЧА 2001-01-28T00:00:00 ДНЕПРОПЕТРОВСКАЯ, ПЯТИХАТСКИЙ, МИРОЛЮБОВКА СТ.115 Ч.1 , 05651-32202,056-7700634 00405641
2 12280443 ПІВДЕННЕ ВІДДІЛЕННЯ ПОЛІЦІЇ КАМ`ЯНСЬКОГО ВІДДІ... БЕЗВІСНО ЗНИКЛИЙ ОЛЕНА ХВАЛОВА ОЛЕКСАНДРІВНА ЕЛЕНА ХВАЛОВА АЛЕКСАНДРОВНА OLENA KHVALOVA OLEKSANDRIVNA 1983-07-09T00:00:00 ЖІНОЧА 1998-03-12T00:00:00 ДНЕПРОПЕТРОВСКАЯ, ДНЕПРОДЗЕРЖИНСК, ДНЕПРОДЗЕРЖ... СТ.115 Ч.1 , 05692-72484,056-7700634 00405661
3 12281408 ДНІПРОВСЬКЕ РАЙОННЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ДНІПРОВ... БЕЗВІСНО ЗНИКЛИЙ ВОЛОДИМИР ХАНДРИГА ПЕТРОВИЧ ВЛАДИМИР ХАНДРИГА ПЕТРОВИЧ VOLODYMYR KHANDRYHA PETROVYCH 1962-10-13T00:00:00 ЧОЛОВІЧА 1992-06-03T00:00:00 ДНЕПРОПЕТРОВСКАЯ, ДНЕПРОПЕТРОВСК, ДНЕПРОПЕТРОВСК СТ.115 Ч.1 , 056-7537704,056-7700634 00405667
4 12280819 ДНІПРОВСЬКИЙ ВІДДІЛ ПОЛІЦІЇ ГУНП В ДНІПРОПЕТРО... БЕЗВІСНО ЗНИКЛИЙ ІГОР ДОНЕЦЬ МИХАЙЛОВИЧ ИГОРЬ ДОНЕЦ МИХАЙЛОВИЧ IHOR DONETS MYKHAILOVYCH 1974-06-21T00:00:00 ЧОЛОВІЧА 1998-10-19T00:00:00 ДНЕПРОПЕТРОВСКАЯ, КИРОВСКИЙ, ДНЕПРОПЕТРОВСК СТ.115 Ч.1 , 0562-7781297,056-7700634 00405673

Investigate data¶

In [5]:
df.RESTRAINT.unique()
Out[5]:
array([',', 'НЕ ЗАСТОСОВУВАВСЯ,', 'НЕ ЗАСТОСОВУВАВСЯ, 05-NOV-05',
       ', 13-NOV-12', 'НЕ ЗАСТОСОВУВАВСЯ, 11-JUL-05',
       'НЕ ЗАСТОСОВУВАВСЯ, 19-DEC-05', 'НЕ ЗАСТОСОВУВАВСЯ, 27-JUN-06',
       'НЕ ЗАСТОСОВУВАВСЯ, 14-JUL-06', 'НЕ ЗАСТОСОВУВАВСЯ, 01-AUG-07',
       'НЕ ЗАСТОСОВУВАВСЯ, 10-NOV-07', 'НЕ ЗАСТОСОВУВАВСЯ, 21-JUL-05',
       'НЕ ЗАСТОСОВУВАВСЯ, 26-FEB-00', 'НЕ ЗАСТОСОВУВАВСЯ, 27-DEC-07',
       'НЕ ЗАСТОСОВУВАВСЯ, 05-SEP-07', 'НЕ ЗАСТОСОВУВАВСЯ, 01-MAR-06',
       'НЕ ЗАСТОСОВУВАВСЯ, 03-SEP-07', 'НЕ ЗАСТОСОВУВАВСЯ, 16-AUG-07',
       'НЕ ЗАСТОСОВУВАВСЯ, 07-JUN-07', 'НЕ ЗАСТОСОВУВАВСЯ, 27-NOV-04',
       'НЕ ЗАСТОСОВУВАВСЯ, 22-OCT-05', 'НЕ ЗАСТОСОВУВАВСЯ, 13-DEC-05',
       'НЕ ЗАСТОСОВУВАВСЯ, 29-MAY-07'], dtype=object)
In [6]:
df.CATEGORY.unique()
Out[6]:
array(['БЕЗВІСНО ЗНИКЛИЙ',
       'БЕЗВІСНО ЗНИКЛИЙ, ЯКИЙ СТАВ ЖЕРТВОЮ КРИМІНАЛЬНОГО ПРАВОПОРУШЕННЯ'],
      dtype=object)
In [7]:
df.ARTICLE_CRIM.unique()
Out[7]:
array(['СТ.115 Ч.1', 'СТ.146 Ч.1', 'СТ.110 Ч.3', 'СТ.110 Ч.2', '',
       'СТ.1-146 Ч.1', 'СТ.438 Ч.1', 'СТ.438 Ч.2', 'СТ.146 Ч.2',
       'СТ.115 Ч.2 П.1', 'СТ.110 Ч.1', 'СТ.120 Ч.1', 'СТ.115 Ч.2 П.2',
       'СТ.286 Ч.2', 'СТ.146 Ч.3', 'СТ.349 Ч.1',
       'СТ.1-146 Ч.1, СТ.438 Ч.1', 'СТ.2-110 Ч.3',
       'СТ.438 Ч.1, СТ.187 Ч.4', 'СТ.147 Ч.1', 'СТ.348 Ч.1',
       'СТ.438 Ч.1, СТ.146 Ч.2', 'СТ.438 Ч.2, СТ.110 Ч.3',
       'СТ.115 Ч.1, СТ.438 Ч.1', 'СТ.258 Ч.3', 'СТ.185 Ч.1', 'СТ.213 Ч.1',
       'СТ.115 Ч.1, СТ.146 Ч.1, СТ.1-146 Ч.1', 'СТ.332 Ч.1', 'СТ.119 Ч.1',
       'СТ.115 Ч.2 П.8', 'СТ.115 Ч.2 П.6', 'СТ.115 Ч.2 П.3', 'СТ.151 Ч.1',
       'СТ.1-114 Ч.1'], dtype=object)

Стаття 110. Посягання на територіальну цілісність і недоторканність України

  1. Умисні дії, вчинені з метою зміни меж території або державного кордону України на порушення порядку, встановленого Конституцією України, а також публічні заклики чи розповсюдження матеріалів із закликами до вчинення таких дій, караються позбавленням волі на строк від трьох до п’яти років з конфіскацією майна або без такої.
  2. Ті самі дії, якщо вони вчинені особою, яка є представником влади, або повторно, або за попередньою змовою групою осіб, або поєднані з розпалюванням національної чи релігійної ворожнечі, караються позбавленням волі на строк від п’яти до десяти років з конфіскацією майна або без такої.
  3. Дії, передбачені частинами першою або другою цієї статті, які призвели до загибелі людей або інших тяжких наслідків, караються позбавленням волі на строк від десяти до п’ятнадцяти років або довічним позбавленням волі з конфіскацією майна або без такої.

Стаття 146. Незаконне позбавлення волі або викрадення людини

  1. Незаконне позбавлення волі або викрадення людини караються обмеженням волі на строк до трьох років або позбавленням волі на той самий строк.
  2. Ті самі діяння, вчинені щодо малолітнього або з корисливих мотивів, щодо двох чи більше осіб або за попередньою змовою групою осіб, або способом, небезпечним для життя чи здоров'я потерпілого, або таке, що супроводжувалося заподіянням йому фізичних страждань, або із застосуванням зброї, або здійснюване протягом тривалого часу, караються обмеженням волі на строк до п'яти років або позбавленням волі на той самий строк.
  3. Діяння, передбачені частинами першою або другою цієї статті, вчинені організованою групою, або такі, що спричинили тяжкі наслідки, караються позбавленням волі на строк від п'яти до десяти років.

Стаття 115. Умисне вбивство

  1. Вбивство, тобто умисне протиправне заподіяння смерті іншій людині, карається позбавленням волі на строк від семи до п'ятнадцяти років.
  2. Умисне вбивство:
    1. двох або більше осіб;
    2. малолітньої дитини або жінки, яка завідомо для винного перебувала у стані вагітності;
    3. заручника або викраденої людини;
    4. вчинене з особливою жорстокістю;
    5. вчинене способом, небезпечним для життя багатьох осіб;
    6. з корисливих мотивів;
    7. з хуліганських мотивів;
    8. особи чи її близького родича у зв'язку з виконанням цією особою службового або громадського обов'язку;
    9. з метою приховати інше кримінальне правопорушення або полегшити його вчинення;
    10. поєднане із зґвалтуванням або сексуальним насильством;
    11. вчинене на замовлення;
    12. вчинене за попередньою змовою групою осіб;
    13. вчинене особою, яка раніше вчинила умисне вбивство, за винятком вбивства, передбаченого статтями 116-118 цього Кодексу;
    14. з мотивів расової, національної чи релігійної нетерпимості, карається позбавленням волі на строк від десяти до п'ятнадцяти років або довічним позбавленням волі, з конфіскацією майна у випадку, передбаченому пунктом 6 частини другої цієї статті.

Стаття 146-1. Насильницьке зникнення

  1. Арешт, затримання, викрадення або позбавлення волі людини в будь-якій іншій формі, вчинене представником держави, в тому числі іноземної, з подальшою відмовою визнати факт такого арешту, затримання, викрадення або позбавлення волі людини в будь-якій іншій формі або приховуванням даних про долю такої людини чи місце перебування караються позбавленням волі на строк від трьох до п’яти років.
  2. Видання наказу або розпорядження про вчинення дій, зазначених у частині першій цієї статті, або невжиття керівником, якому стало відомо про вчинення дій, зазначених у частині першій цієї статті, його підлеглими заходів для їх припинення та неповідомлення компетентних органів про злочин караються позбавленням волі на строк від п’яти до семи років.

Стаття 438. Порушення законів та звичаїв війни

  1. Жорстоке поводження з військовополоненими або цивільним населенням, вигнання цивільного населення для примусових робіт, розграбування національних цінностей на окупованій території, застосування засобів ведення війни, заборонених міжнародним правом, інші порушення законів та звичаїв війни, що передбачені міжнародними договорами, згода на обов'язковість яких надана Верховною Радою України, а також віддання наказу про вчинення таких дій караються позбавленням волі на строк від восьми до дванадцяти років.
  2. Ті самі діяння, якщо вони поєднані з умисним вбивством, караються позбавленням волі на строк від десяти до п'ятнадцяти років або довічним позбавленням волі.

Clear data¶

In [8]:
df.drop(columns=[
    'FIRST_NAME_U',
    'LAST_NAME_U',
    'MIDDLE_NAME_U',

    'FIRST_NAME_R',
    'LAST_NAME_R',
    'MIDDLE_NAME_R',

    'FIRST_NAME_E',
    'LAST_NAME_E',
    'MIDDLE_NAME_E',
], inplace=True)

df.drop(columns=["RESTRAINT", 'CATEGORY'], inplace=True)
In [9]:
len_before = len(df)
df = df[df.LOST_DATE.apply(lambda x: x < datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S"))]
df = df[df.BIRTH_DATE.apply(lambda x: x < datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S"))]
len_after = len(df)
print(f"Видалено {len_before - len_after} некоректних записи")
df.LOST_DATE = pd.to_datetime(df.LOST_DATE, format="%Y-%m-%dT%H:%M:%S", errors="coerce")
df.BIRTH_DATE = pd.to_datetime(df.BIRTH_DATE, format="%Y-%m-%dT%H:%M:%S", errors="coerce")
Видалено 24 некоректних записи
In [79]:
df["AGE"] = (df.LOST_DATE - df.BIRTH_DATE).apply(lambda x: x.days / 365)
war_start = datetime.datetime(2022, 2, 24, 0, 0)
df['was_war'] = df.LOST_DATE > war_start
In [11]:
df.head()
Out[11]:
ID OVD BIRTH_DATE SEX LOST_DATE LOST_PLACE ARTICLE_CRIM CONTACT PHOTOID AGE
0 12280824 ЧЕЧЕЛІВСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ДНІПРОВСЬКОГО В... 1984-10-22 ЖІНОЧА 2000-11-20 ДНЕПРОПЕТРОВСКАЯ, КРАСНОГВАРДЕЙСКИЙ, ДНЕПРОПЕТ... СТ.115 Ч.1 056-7708234,056-7700634 00405597 16.090411
1 12280698 П'ЯТИХАТСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ЖОВТОВОДСЬКОГО... 1974-08-21 ЧОЛОВІЧА 2001-01-28 ДНЕПРОПЕТРОВСКАЯ, ПЯТИХАТСКИЙ, МИРОЛЮБОВКА СТ.115 Ч.1 05651-32202,056-7700634 00405641 26.457534
2 12280443 ПІВДЕННЕ ВІДДІЛЕННЯ ПОЛІЦІЇ КАМ`ЯНСЬКОГО ВІДДІ... 1983-07-09 ЖІНОЧА 1998-03-12 ДНЕПРОПЕТРОВСКАЯ, ДНЕПРОДЗЕРЖИНСК, ДНЕПРОДЗЕРЖ... СТ.115 Ч.1 05692-72484,056-7700634 00405661 14.684932
3 12281408 ДНІПРОВСЬКЕ РАЙОННЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ДНІПРОВ... 1962-10-13 ЧОЛОВІЧА 1992-06-03 ДНЕПРОПЕТРОВСКАЯ, ДНЕПРОПЕТРОВСК, ДНЕПРОПЕТРОВСК СТ.115 Ч.1 056-7537704,056-7700634 00405667 29.660274
4 12280819 ДНІПРОВСЬКИЙ ВІДДІЛ ПОЛІЦІЇ ГУНП В ДНІПРОПЕТРО... 1974-06-21 ЧОЛОВІЧА 1998-10-19 ДНЕПРОПЕТРОВСКАЯ, КИРОВСКИЙ, ДНЕПРОПЕТРОВСК СТ.115 Ч.1 0562-7781297,056-7700634 00405673 24.345205

Regex creation for ODV¶

In [12]:
import re

"""
country -> region             -> city  -> area              -> sub_area
Україна -> львівська область  -> Львів -> франкіський район
"""
new_regex0 = "(?P<city>.*) (?:УПРАВЛІННЯ|ВІДДІЛЕННЯ|ВІДДІЛ)(?: ПОЛІЦІЇ)? {1,2}ГУ {0,1}НП (?:В|У) (?P<region>.*) ОБЛ"
new_regex1 = r"(?P<area1>.*) ?(?:УПРАВЛІННЯ|ВІДДІЛЕННЯ|ВІДДІЛ)(?: ПОЛІЦІЇ)? ?(?P<number>№\d)?(?: (?P<city1>.*) ВІДДІЛУ?)?(?: ПОЛІЦІЇ)? ГУ {0,1}НП (?:В|У|) ?(?P<region1>.*) (?:ОБЛ\.|ОБЛАСТІ)"
"""Examples for regex1: # Please use regex101.com to validate
1)
ЧЕЧЕЛІВСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ДНІПРОВСЬКОГО ВІДДІЛУ ГУНП В ДНІПРОПЕТРОВСЬКІЙ ОБЛ.
П'ЯТИХАТСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ЖОВТОВОДСЬКОГО ВІДДІЛУ ГУНП в ДНІПРОПЕТРОВСЬКІЙ ОБЛ.
2)
АВДІЇВСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ПОКРОВСЬКОГО ВІДДІЛУ ПОЛІЦІЇ ГУНП В ДОНЕЦЬКІЙ ОБЛ.
ЛЕБЕДИНСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ СУМСЬКОГО РАЙОННОГО ВІДДІЛУ ПОЛІЦІЇ ГУНП В СУМСЬКІЙ ОБЛАСТІ
КІРОВОГРАДСЬКЕ РАЙОННЕ ВІДДІЛЕННЯ ПОЛІЦІЇ КРОПИВНИЦЬКОГО ВІДДІЛУ ПОЛІЦІЇ ГУНП В КІРОВОГРАДСЬКІЙ ОБЛАСТІ
3)
ДНІПРОВСЬКИЙ ВІДДІЛ ПОЛІЦІЇ ГУНП В ДНІПРОПЕТРОВСЬКІЙ ОБЛ.
4)
ЧЕЧЕЛІВСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ДНІПРОВСЬКОГО ВІДДІЛУ ГУНП В ДНІПРОПЕТРОВСЬКІЙ ОБЛ.
П'ЯТИХАТСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ЖОВТОВОДСЬКОГО ВІДДІЛУ ГУНП в ДНІПРОПЕТРОВСЬКІЙ ОБЛ.
ПІВДЕННЕ ВІДДІЛЕННЯ ПОЛІЦІЇ КАМ`ЯНСЬКОГО ВІДДІЛУ ГУНП В ДНІПРОПЕТРОВСЬКІЙ ОБЛ.
ДНІПРОВСЬКЕ РАЙОННЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ДНІПРОВСЬКОГО ВІДДІЛУ ГУНП В ДНІПРОПЕТРОВСЬКІЙ ОБЛ.
5)
ВІДДІЛЕННЯ ПОЛІЦІЇ №2 ПОЛТАВСЬКОГО ВІДДІЛУ ГУНП В ПОЛТАВСЬКІЙ ОБЛАСТІ
6)
УСАТІВСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ  БІЛЯЇВСЬКОГО ВІДДІЛУ ГУНП ОДЕСЬКІЙ ОБЛАСТІ
7)
КОРАБЕЛЬНЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ХЕРСОНСЬКОГО ВІДДІЛУ ГУ НП В ХЕРСОНСЬКІЙ ОБЛАСТІ
"""
new_regex2 = r"(?P<area2>.*) (?:УПРАВЛІННЯ|ВІДДІЛЕННЯ|ВІДДІЛ) ПОЛІЦІЇ ГУНП В М. (?P<city2>.*)"
"""
ДЕСНЯНСЬКЕ УПРАВЛІННЯ ПОЛІЦІЇ ГУНП В М. КИЄВІ

ДНІПРОВСЬКЕ УПРАВЛІННЯ ПОЛІЦІЇ ГУНП В М. КИЄВІ
ДЕСНЯНСЬКЕ УПРАВЛІННЯ ПОЛІЦІЇ ГУНП В М. КИЄВІ
СОЛОМ’ЯНСЬКЕ УПРАВЛІННЯ ПОЛІЦІЇ ГУНП В М. КИЄВІ
ШЕВЧЕНКІВСЬКЕ УПРАВЛІННЯ ПОЛІЦІЇ ГУНП В М. КИЄВІ
ДАРНИЦЬКЕ УПРАВЛІННЯ ПОЛІЦІЇ ГУНП В М. КИЄВІ
"""
new_regex3 = r"(?:(?P<sub_area3>.*) ВІДДІЛЕННЯ ПОЛІЦІЇ )?(?P<area_name3>.*) ВІДДІЛУ? ПОЛІЦІЇ В МІСТІ (?P<city3>.*) ГУ {0,1}НП (?:В|У) (?P<region3>.*) ОБЛАСТІ"
"""
СУВОРОВСЬКИЙ ВІДДІЛ ПОЛІЦІЇ В МІСТІ ОДЕСІ ГУНП В ОДЕСЬКІЙ ОБЛАСТІ
ХАДЖИБЕЇВСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ СУВОРОВСЬКОГО ВІДДІЛУ ПОЛІЦІЇ В МІСТІ ОДЕСІ ГУНП В ОДЕСЬКІЙ ОБЛАСТІ
"""

new_regex4 = r"(?:(?P<area4>.*) РВ )?(?:(?P<city4>.*) (?:МВ|МУ) )?ГУМВСУ (?:В|У)? ?(?P<region4>.*) ОБЛ\."
"""
СЛОВ’ЯНОСЕРБСЬКИЙ РВ ГУМВСУ У ЛУГАНСЬКІЙ ОБЛ.
КІРОВСЬКИЙ МВ ГУМВСУ У ЛУГАНСЬКІЙ ОБЛ.
ЖОВТНЕВИЙ РВ ЛУГАНСЬКОГО МУ ГУМВСУ У ЛУГАНСЬКІЙ ОБЛ.

КУЙБИШЕВСЬКИЙ РВ ДОНЕЦЬКОГО МУ ГУМВСУ В ДОНЕЦЬКІЙ ОБЛ.
БУДЬОНІВСЬКИЙ РВ ДОНЕЦЬКОГО МУ ГУМВСУ В ДОНЕЦЬКІЙ ОБЛ.
ПРОЛЕТАРСЬКИЙ РВ ДОНЕЦЬКОГО МУ ГУМВСУ В ДОНЕЦЬКІЙ ОБЛ.
СОВЄТСЬКИЙ РВ МАКІЇВСЬКОГО МУ ГУМВСУ В ДОНЕЦЬКІЙ ОБЛ.
КІРОВСЬКИЙ РВ МАКІЇВСЬКОГО МУ ГУМВСУ В ДОНЕЦЬКІЙ ОБЛ.

ЧЕРВОНОГВАРДІЙСЬКИЙ РВ МАКІЇВСЬКОГО МУ ГУМВСУ ДОНЕЦЬКОЇ ОБЛ.
ЦЕНТРАЛЬНО-МІСЬКИЙ РВ МАКІЇВСЬКОГО МУ ГУМВСУ ДОНЕЦЬКОЇ ОБЛ.
"""
# TODO: add rule if city4 is None: city4 = sub_area4
"""
for next examples:
СТАРОБЕШІВСЬКИЙ РВ ГУМВСУ В ДОНЕЦЬКІЙ ОБЛ.
АМВРОСІЇВСЬКИЙ РВ ГУМВСУ В ДОНЕЦЬКІЙ ОБЛ.

ПЕРВОМАЙСЬКИЙ МВ ГУМВСУ У ЛУГАНСЬКІЙ ОБЛ.
КІРОВСЬКИЙ МВ ГУМВСУ В ДОНЕЦЬКІЙ ОБЛ.
"""

new_regex5 = r"(?P<city5>.*) (МВ|РВ|ПВМ|МРВ) ГУ {0,1}МВ {0,1}С УКРАЇНИ( В)? АР КР?ИМ"
"""
ЯЛТИНСЬКЕ МУ СІМФЕРОПОЛЬСЬКОГО МВ ГУМВС УКРАЇНИ В АР КИМ # тому в крим стоїть ?
"""

new_regex6 = r"ГОЛОВНЕ УПРАВЛІННЯ НАЦІОНАЛЬНОЇ ПОЛІЦІЇ (В|У) (?P<city6>.*) ОБЛАСТІ"
new_regex7 = r"ГОЛОВНЕ УПРАВЛІННЯ НАЦІОНАЛЬНОЇ ПОЛІЦІЇ В( АВТОНОМНІЙ РЕСПУБЛІЦІ КРИМ ТА)? М. (?P<city7>.*)"
"""
ГОЛОВНЕ УПРАВЛІННЯ НАЦІОНАЛЬНОЇ ПОЛІЦІЇ В М. КИЄВІ
"""

new_regex8 = r"(?P<area8>.*) РВ (?P<city8>.*) МУ"
new_regex9 = r"(?:.*) В М. (?P<city9>КИЄВІ)"
"""
    "ВІДДІЛ ПОЛІЦІЇ В РІЧКОВОМУ ПОРТУ КИЇВ ГУНП В М. КИЄВІ")
    "УПРАВЛІННЯ ПОЛІЦІЇ В МЕТРОПОЛІТЕНІ ГУНП В М. КИЄВІ")
    "ВІДДІЛ ПОЛІЦІЇ НА СТАНЦІЯХ ЗАЛІЗНИЧНОГО ТРАНСПОРТУ ГУНП В М. КИЄВІ")
"""
new_regex10 = \
    r"(:?" + r")|(:?".join(
        [
            r"(?P<city10_1>ЖДАНОВСЬКИЙ) МВВС (?P<region10_1>ДОНЕЦЬКОЇ) ОБЛ.",
            r"\(ВИКЛЮЧЕНО\) ЗЕЛЕНОДОЛЬСЬКЕ ВП (?P<city10_2>НІКОПОЛЬСЬКОГО) ВІДДІЛУ ГУНП В (?P<region10_2>ДНІПРОПЕТРОВСЬКІЙ) ОБЛ.",
            r"ВІДДІЛ ПОЛІЦІЇ ЗОНИ (?P<city10_3>ЧОРНОБИЛЬСЬКОЇ) АЕС ГУНП В (?P<region10_3>КИЇВСЬКІЙ) ОБЛАСТІ",
            r"(?P<city10_4>КЕРЧЕНСЬКЕ) ГВ АР Крим",
            r"ОВСТ ЦЕНТРАЛЬНОГО АЕРОПОРТУ М. (?P<city10_5>СІМФЕРОПОЛЬ) АР КРИМ",
            r"УКР УМВС В (?P<city10_6>ІВАНО-ФРАНКІВСЬКОЇ) ОБЛ.",
            r"ЦЕНТРАЛЬНО-МІСЬКИЙ РВ (?P<city10_7>ГОРЛІВСЬКОГО) МУ ГУМВСУ ДОНЕЦЬКОЇ ОБЛ",
        ]) + r")"
In [13]:
# Перевірка одного regex
# regex = new_regex8
# tmp_match = df[df.OVD.apply(lambda s: bool(re.match(regex, s, flags=re.IGNORECASE)))]
# tmp_match.OVD.unique()

Regex test¶

In [14]:
l_regexes = [
    new_regex1,
    new_regex2,
    new_regex3,
    new_regex4,
    new_regex5,
    new_regex6,
    new_regex7,
    new_regex8,
    new_regex9,
    new_regex10,
]
regex = r"(:?" + \
        r")|(:?".join(
            l_regexes
        ) + r")"

not_match = df[df.OVD.apply(lambda s: not bool(re.match(regex, s, flags=re.IGNORECASE)))]
match = df[df.OVD.apply(lambda s: bool(re.match(regex, s, flags=re.IGNORECASE)))]

assert not len(not_match), f"Деякі рядки не заматчились під regex {len(not_match)=} {len(match)=}"
if len(not_match):
    print(not_match.OVD.unique())

Розпаршування результатів¶

In [15]:
info = df.OVD.apply(lambda s: re.match(regex, s, flags=re.IGNORECASE))
data = []

with open('data/area_info.csv', 'w') as f, open("data/broken.csv", "w") as bf:
    f.write(f"index,area,city,region\n")
    bf.write("|".join(df.columns) + "\n")
    
    for index, match in info.items():
        group = match.groupdict()
        area = [group[k] for k in group if k.startswith("area") and group[k] is not None]
        area = (area and area[0]) or None

        city = [group[k] for k in group if k.startswith("city") and group[k] is not None]
        city = (city and city[0]) or None
        if group["city4"] is None and group["area4"] is not None:
            # this works ok
            city = group["area4"]
        if group["city1"] is None and group["region1"] is not None:
            city = group["region1"]

        region = [group[k] for k in group if k.startswith("region") and group[k] is not None]
        region = (region and region[0]) or None

        if not region:
            bf.write("|".join(map(str, df.loc[index].tolist())) + "\n")
        f.write(f"{index},{area},{city},{region}\n")

        data.append((region, city, area,))

df[["region", "city", "area"]] = data
df.head()
Out[15]:
ID OVD BIRTH_DATE SEX LOST_DATE LOST_PLACE ARTICLE_CRIM CONTACT PHOTOID AGE region city area
0 12280824 ЧЕЧЕЛІВСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ДНІПРОВСЬКОГО В... 1984-10-22 ЖІНОЧА 2000-11-20 ДНЕПРОПЕТРОВСКАЯ, КРАСНОГВАРДЕЙСКИЙ, ДНЕПРОПЕТ... СТ.115 Ч.1 056-7708234,056-7700634 00405597 16.090411 ДНІПРОПЕТРОВСЬКІЙ ДНІПРОВСЬКОГО ЧЕЧЕЛІВСЬКЕ
1 12280698 П'ЯТИХАТСЬКЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ЖОВТОВОДСЬКОГО... 1974-08-21 ЧОЛОВІЧА 2001-01-28 ДНЕПРОПЕТРОВСКАЯ, ПЯТИХАТСКИЙ, МИРОЛЮБОВКА СТ.115 Ч.1 05651-32202,056-7700634 00405641 26.457534 ДНІПРОПЕТРОВСЬКІЙ ЖОВТОВОДСЬКОГО П'ЯТИХАТСЬКЕ
2 12280443 ПІВДЕННЕ ВІДДІЛЕННЯ ПОЛІЦІЇ КАМ`ЯНСЬКОГО ВІДДІ... 1983-07-09 ЖІНОЧА 1998-03-12 ДНЕПРОПЕТРОВСКАЯ, ДНЕПРОДЗЕРЖИНСК, ДНЕПРОДЗЕРЖ... СТ.115 Ч.1 05692-72484,056-7700634 00405661 14.684932 ДНІПРОПЕТРОВСЬКІЙ КАМ`ЯНСЬКОГО ПІВДЕННЕ
3 12281408 ДНІПРОВСЬКЕ РАЙОННЕ ВІДДІЛЕННЯ ПОЛІЦІЇ ДНІПРОВ... 1962-10-13 ЧОЛОВІЧА 1992-06-03 ДНЕПРОПЕТРОВСКАЯ, ДНЕПРОПЕТРОВСК, ДНЕПРОПЕТРОВСК СТ.115 Ч.1 056-7537704,056-7700634 00405667 29.660274 ДНІПРОПЕТРОВСЬКІЙ ДНІПРОВСЬКОГО ДНІПРОВСЬКЕ РАЙОННЕ
4 12280819 ДНІПРОВСЬКИЙ ВІДДІЛ ПОЛІЦІЇ ГУНП В ДНІПРОПЕТРО... 1974-06-21 ЧОЛОВІЧА 1998-10-19 ДНЕПРОПЕТРОВСКАЯ, КИРОВСКИЙ, ДНЕПРОПЕТРОВСК СТ.115 Ч.1 0562-7781297,056-7700634 00405673 24.345205 ДНІПРОПЕТРОВСЬКІЙ ДНІПРОПЕТРОВСЬКІЙ ДНІПРОВСЬКИЙ
In [16]:
df[["region", "city"]].drop_duplicates()
Out[16]:
region city
0 ДНІПРОПЕТРОВСЬКІЙ ДНІПРОВСЬКОГО
1 ДНІПРОПЕТРОВСЬКІЙ ЖОВТОВОДСЬКОГО
2 ДНІПРОПЕТРОВСЬКІЙ КАМ`ЯНСЬКОГО
4 ДНІПРОПЕТРОВСЬКІЙ ДНІПРОПЕТРОВСЬКІЙ
10 ДНІПРОПЕТРОВСЬКІЙ КРИВОРІЗЬКОГО
... ... ...
10032 None ВІННИЦЬКІЙ
10416 None ВОЛИНСЬКІЙ
11291 None КИЇВСЬКІЙ
13849 ХЕРСОНСЬКІЙ КАХОВСЬКОГО
23447 КІРОВОГРАДСЬКІЙ ГАЙВОРОНСЬКОГО

213 rows × 2 columns

In [59]:
# for i, row in df[["region", "city"]].drop_duplicates().iterrows():
#     print(row.region, row.city)
In [18]:
# область:
class Region:
    ODESA = "Одеська"
    DNIPRO = "Дніпропетровська"
    CHERNIHIV = "Чернігівська"
    CHARKIV = "Харківська"
    GYTOMUR = "Житомирська"
    POLTAVA = "Полтавська"
    HERSON = "Херсонська"
    KUIV = "Київська"
    ZAPORIZIA = "Запорізька"
    LUHANSK = "Луганська"
    DONETSK = "Донецька"
    VINNUTSIA = "Вінницька"
    KRUM = "Автономна Республіка Крим"
    MUKOLAIV = "Миколаївська"
    KIROVOGRAD = "Кіровоградська"
    SYMU = "Сумська"
    LVIV = "Львівська"
    CHERKASU = "Черкаська"
    KHMELNUTSKA = "Хмельницька"
    VOLUNSKA = "Волинська"
    RIVNE = "Рівненська"
    IF = "Івано-Франківська"
    TERNOPIL = "Тернопільська область"
    ZAKARPATSKA = "Закарпатська область"
    CHERNIVETSKA = "Чернівецька область"
    # м. Севастополь -> ЗАРАХУЮ  до КРИму
    # м. Київ        -> ЗАРАХУЮ  до КИЇВСЬКОЇ
In [19]:
m = {
    ('ВОЛИНСЬКІЙ', 'ВОЛИНСЬКІЙ'): (Region.VOLUNSKA, 'ВОЛИНСЬКІЙ'),
	('ВОЛИНСЬКІЙ', 'ВОЛОДИМИР-ВОЛИНСЬКОГО'): (Region.VOLUNSKA, 'ВОЛОДИМИР-ВОЛИНСЬКОГО'),
	('ВІННИЦЬКІЙ', 'БЕРШАДСЬКОГО'): (Region.VINNUTSIA, 'БЕРШАДСЬКОГО'),
	('ВІННИЦЬКІЙ', 'ВІННИЦЬКОГО'): (Region.VINNUTSIA, 'ВІННИЦЬКОГО'),
	('ВІННИЦЬКІЙ', 'ВІННИЦЬКІЙ'): (Region.VINNUTSIA, 'ВІННИЦЬКІЙ'),
	('ВІННИЦЬКІЙ', 'ЖМЕРИНСЬКОГО'): (Region.VINNUTSIA, 'ЖМЕРИНСЬКОГО'),
	('ВІННИЦЬКІЙ', 'КАЛИНІВСЬКОГО'): (Region.VINNUTSIA, 'КАЛИНІВСЬКОГО'),
	('ВІННИЦЬКІЙ', 'МОГИЛІВ-ПОДІЛЬСЬКОГО'): (Region.VINNUTSIA, 'МОГИЛІВ-ПОДІЛЬСЬКОГО'),
	('ВІННИЦЬКІЙ', 'НЕМИРІВСЬКОГО'): (Region.VINNUTSIA, 'НЕМИРІВСЬКОГО'),
	('ДНІПРОПЕТРОВСЬКІЙ', "КАМ'ЯНСЬКОГО"): (Region.DNIPRO, "КАМ'ЯНСЬКОГО"),
	('ДНІПРОПЕТРОВСЬКІЙ', 'ДНІПРОВСЬКОГО'): (Region.DNIPRO, 'ДНІПРОВСЬКОГО'),
	('ДНІПРОПЕТРОВСЬКІЙ', 'ДНІПРОПЕТРОВСЬКІЙ'): (Region.DNIPRO, 'ДНІПРОПЕТРОВСЬКІЙ'),
	('ДНІПРОПЕТРОВСЬКІЙ', 'ЖОВТОВОДСЬКОГО'): (Region.DNIPRO, 'ЖОВТОВОДСЬКОГО'),
	('ДНІПРОПЕТРОВСЬКІЙ', 'КАМ`ЯНСЬКОГО'): (Region.DNIPRO, 'КАМ`ЯНСЬКОГО'),
	('ДНІПРОПЕТРОВСЬКІЙ', 'КРИВОРІЗЬКОГО'): (Region.DNIPRO, 'КРИВОРІЗЬКОГО'),
	('ДНІПРОПЕТРОВСЬКІЙ', 'НА СТАНЦІЇ №1 ДНІПРОВСЬКОГО'): (Region.DNIPRO, 'НА СТАНЦІЇ №1 ДНІПРОВСЬКОГО'),
	('ДНІПРОПЕТРОВСЬКІЙ', 'НОВОМОСКОВСЬКОГО'): (Region.DNIPRO, 'НОВОМОСКОВСЬКОГО'),
	('ДНІПРОПЕТРОВСЬКІЙ', 'НІКОПОЛЬСЬКОГО'): (Region.DNIPRO, 'НІКОПОЛЬСЬКОГО'),
	('ДНІПРОПЕТРОВСЬКІЙ', 'ПАВЛОГРАДСЬКОГО'): (Region.DNIPRO, 'ПАВЛОГРАДСЬКОГО'),
	('ДНІПРОПЕТРОВСЬКІЙ', 'СИНЕЛЬНИКІВСЬКОГО'): (Region.DNIPRO, 'СИНЕЛЬНИКІВСЬКОГО'),
	('ДОНЕЦЬКОЇ', 'ЖДАНОВСЬКИЙ'): (Region.DONETSK, 'ЖДАНОВСЬКИЙ'),
	('ДОНЕЦЬКОЇ', 'МАКІЇВСЬКОГО'): (Region.DONETSK, 'МАКІЇВСЬКОГО'),
	('ДОНЕЦЬКІЙ', 'АМВРОСІЇВСЬКИЙ'): (Region.DONETSK, 'АМВРОСІЇВСЬКИЙ'),
	('ДОНЕЦЬКІЙ', 'БАХМУТСЬКОГО'): (Region.DONETSK, 'БАХМУТСЬКОГО'),
	('ДОНЕЦЬКІЙ', 'ВОЛНОВАСЬКОГО'): (Region.DONETSK, 'ВОЛНОВАСЬКОГО'),
	('ДОНЕЦЬКІЙ', 'ГОРЛІВСЬКОГО'): (Region.DONETSK, 'ГОРЛІВСЬКОГО'),
	('ДОНЕЦЬКІЙ', 'ДЕБАЛЬЦЕВСЬКИЙ'): (Region.DONETSK, 'ДЕБАЛЬЦЕВСЬКИЙ'),
	('ДОНЕЦЬКІЙ', 'ДОКУЧАЄВСЬКИЙ'): (Region.DONETSK, 'ДОКУЧАЄВСЬКИЙ'),
	('ДОНЕЦЬКІЙ', 'ДОНЕЦЬКЕ'): (Region.DONETSK, 'ДОНЕЦЬКЕ'),
	('ДОНЕЦЬКІЙ', 'ДОНЕЦЬКОГО'): (Region.DONETSK, 'ДОНЕЦЬКОГО'),
	('ДОНЕЦЬКІЙ', 'ДОНЕЦЬКІЙ'): (Region.DONETSK, 'ДОНЕЦЬКІЙ'),
	('ДОНЕЦЬКІЙ', 'КРАМАТОРСЬКОГО '): (Region.DONETSK, 'КРАМАТОРСЬКОГО '),
	('ДОНЕЦЬКІЙ', 'КІРОВСЬКИЙ'): (Region.DONETSK, 'КІРОВСЬКИЙ'),
	('ДОНЕЦЬКІЙ', 'МАКІЇВСЬКОГО'): (Region.DONETSK, 'МАКІЇВСЬКОГО'),
	('ДОНЕЦЬКІЙ', 'НОВОАЗОВСЬКИЙ'): (Region.DONETSK, 'НОВОАЗОВСЬКИЙ'),
	('ДОНЕЦЬКІЙ', 'ПОКРОВСЬКОГО'): (Region.DONETSK, 'ПОКРОВСЬКОГО'),
	('ДОНЕЦЬКІЙ', 'СЛОВ’ЯНСЬКОГО'): (Region.DONETSK, 'СЛОВ’ЯНСЬКОГО'),
	('ДОНЕЦЬКІЙ', 'СНІЖНЯНСЬКИЙ'): (Region.DONETSK, 'СНІЖНЯНСЬКИЙ'),
	('ДОНЕЦЬКІЙ', 'СТАРОБЕШІВСЬКИЙ'): (Region.DONETSK, 'СТАРОБЕШІВСЬКИЙ'),
	('ДОНЕЦЬКІЙ', 'ТЕЛЬМАНІВСЬКИЙ'): (Region.DONETSK, 'ТЕЛЬМАНІВСЬКИЙ'),
	('ДОНЕЦЬКІЙ', 'ТОРЕЗЬКИЙ'): (Region.DONETSK, 'ТОРЕЗЬКИЙ'),
	('ДОНЕЦЬКІЙ', 'ХАРЦИЗЬКИЙ'): (Region.DONETSK, 'ХАРЦИЗЬКИЙ'),
	('ДОНЕЦЬКІЙ', 'ЦЕНТРАЛЬНОГО'): (Region.DONETSK, 'ЦЕНТРАЛЬНОГО'),
	('ДОНЕЦЬКІЙ', 'ШАХТАРСЬКИЙ'): (Region.DONETSK, 'ШАХТАРСЬКИЙ'),
	('ДОНЕЦЬКІЙ', 'ЯСИНУВАТСЬКИЙ'): (Region.DONETSK, 'ЯСИНУВАТСЬКИЙ'),
	('ДОНЕЦЬКІЙ', 'ЄНАКІЄВСЬКИЙ'): (Region.DONETSK, 'ЄНАКІЄВСЬКИЙ'),
	('ЖИТОМИРСЬКІЙ', 'БЕРДИЧІВСЬКОГО'): (Region.GYTOMUR, 'БЕРДИЧІВСЬКОГО'),
	('ЖИТОМИРСЬКІЙ', 'ЖИТОМИРСЬКОГО'): (Region.GYTOMUR, 'ЖИТОМИРСЬКОГО'),
	('ЖИТОМИРСЬКІЙ', 'ЖИТОМИРСЬКІЙ'): (Region.GYTOMUR, 'ЖИТОМИРСЬКІЙ'),
	('ЖИТОМИРСЬКІЙ', 'КОРОСТЕНСЬКОГО'): (Region.GYTOMUR, 'КОРОСТЕНСЬКОГО'),
	('ЖИТОМИРСЬКІЙ', 'КОРОСТИШІВСЬКОГО'): (Region.GYTOMUR, 'КОРОСТИШІВСЬКОГО'),
	('ЖИТОМИРСЬКІЙ', 'НОВОГРАД-ВОЛИНСЬКОГО'): (Region.GYTOMUR, 'НОВОГРАД-ВОЛИНСЬКОГО'),
	('ЗАКАРПАТСЬКІЙ', 'БЕРЕГІВСЬКОГО'): (Region.ZAKARPATSKA, 'БЕРЕГІВСЬКОГО'),
	('ЗАКАРПАТСЬКІЙ', 'ЗАКАРПАТСЬКІЙ'): (Region.ZAKARPATSKA, 'ЗАКАРПАТСЬКІЙ'),
	('ЗАКАРПАТСЬКІЙ', 'МУКАЧІВСЬКОГО'): (Region.ZAKARPATSKA, 'МУКАЧІВСЬКОГО'),
	('ЗАКАРПАТСЬКІЙ', 'ТЯЧІВСЬКОГО'): (Region.ZAKARPATSKA, 'ТЯЧІВСЬКОГО'),
	('ЗАКАРПАТСЬКІЙ', 'УЖГОРОДСЬКОГО'): (Region.ZAKARPATSKA, 'УЖГОРОДСЬКОГО'),
	('ЗАКАРПАТСЬКІЙ', 'ХУСТСЬКОГО'): (Region.ZAKARPATSKA, 'ХУСТСЬКОГО'),
	('ЗАПОРІЗЬКІЙ', 'БЕРДЯНСЬКОГО'): (Region.ZAPORIZIA, 'БЕРДЯНСЬКОГО'),
	('ЗАПОРІЗЬКІЙ', 'ВАСИЛІВСЬКОГО'): (Region.ZAPORIZIA, 'ВАСИЛІВСЬКОГО'),
	('ЗАПОРІЗЬКІЙ', 'ДНІПРОВСЬКОГО'): (Region.ZAPORIZIA, 'ДНІПРОВСЬКОГО'),
	('ЗАПОРІЗЬКІЙ', 'ЕНЕРГОДАРСЬКОГО'): (Region.ZAPORIZIA, 'ЕНЕРГОДАРСЬКОГО'),
	('ЗАПОРІЗЬКІЙ', 'ЗАПОРІЗЬКІЙ'): (Region.ZAPORIZIA, 'ЗАПОРІЗЬКІЙ'),
	('ЗАПОРІЗЬКІЙ', 'МЕЛІТОПОЛЬСЬКОГО'): (Region.ZAPORIZIA, 'МЕЛІТОПОЛЬСЬКОГО'),
	('ЗАПОРІЗЬКІЙ', 'ПОЛОГІВСЬКОГО'): (Region.ZAPORIZIA, 'ПОЛОГІВСЬКОГО'),
	('КИЇВСЬКІЙ', 'БРОВАРСЬКОГО'): (Region.KUIV, 'БРОВАРСЬКОГО'),
	('КИЇВСЬКІЙ', 'В АЕРОПОРТУ БОРИСПІЛЬ БОРИСПІЛЬСЬКОГО'): (Region.KUIV, 'В АЕРОПОРТУ БОРИСПІЛЬ БОРИСПІЛЬСЬКОГО'),
	('КИЇВСЬКІЙ', 'ВАСИЛЬКІВСЬКОГО'): (Region.KUIV, 'ВАСИЛЬКІВСЬКОГО'),
	('КИЇВСЬКІЙ', 'ВИШГОРОДСЬКОГО'): (Region.KUIV, 'ВИШГОРОДСЬКОГО'),
	('КИЇВСЬКІЙ', 'КИЄВО-СВЯТОШИНСЬКОГО'): (Region.KUIV, 'КИЄВО-СВЯТОШИНСЬКОГО'),
	('КИЇВСЬКІЙ', 'КИЇВСЬКІЙ'): (Region.KUIV, 'КИЇВСЬКІЙ'),
	('КИЇВСЬКІЙ', 'МИРОНІВСЬКОГО'): (Region.KUIV, 'МИРОНІВСЬКОГО'),
	('КИЇВСЬКІЙ', 'ЧОРНОБИЛЬСЬКОЇ'): (Region.KUIV, 'ЧОРНОБИЛЬСЬКОЇ'),
	('КИЇВСЬКІЙ', 'ІРПІНСЬКОГО'): (Region.KUIV, 'ІРПІНСЬКОГО'),
	('КІРОВОГРАДСЬКІЙ', 'ГАЙВОРОНСЬКОГО'): (Region.KIROVOGRAD, 'ГАЙВОРОНСЬКОГО'),
	('КІРОВОГРАДСЬКІЙ', 'ГОЛОВАНІВСЬКОГО'): (Region.KIROVOGRAD, 'ГОЛОВАНІВСЬКОГО'),
	('КІРОВОГРАДСЬКІЙ', 'ДОЛИНСЬКОГО'): (Region.KIROVOGRAD, 'ДОЛИНСЬКОГО'),
	('КІРОВОГРАДСЬКІЙ', 'ЗНАМ’ЯНСЬКОГО'): (Region.KIROVOGRAD, 'ЗНАМ’ЯНСЬКОГО'),
	('КІРОВОГРАДСЬКІЙ', 'КРОПИВНИЦЬКОГО'): (Region.KIROVOGRAD, 'КРОПИВНИЦЬКОГО'),
	('КІРОВОГРАДСЬКІЙ', 'КІРОВОГРАДСЬКІЙ'): (Region.KIROVOGRAD, 'КІРОВОГРАДСЬКІЙ'),
	('КІРОВОГРАДСЬКІЙ', 'МАЛОВИСКІВСЬКОГО'): (Region.KIROVOGRAD, 'МАЛОВИСКІВСЬКОГО'),
	('КІРОВОГРАДСЬКІЙ', 'НОВОУКРАЇНСЬКОГО'): (Region.KIROVOGRAD, 'НОВОУКРАЇНСЬКОГО'),
	('КІРОВОГРАДСЬКІЙ', 'ОЛЕКСАНДРІЙСЬКОГО'): (Region.KIROVOGRAD, 'ОЛЕКСАНДРІЙСЬКОГО'),
	('ЛУГАНСЬКІЙ', 'АЛЧЕВСЬКИЙ'): (Region.LUHANSK, 'АЛЧЕВСЬКИЙ'),
	('ЛУГАНСЬКІЙ', 'АНТРАЦИТІВСЬКИЙ'): (Region.LUHANSK, 'АНТРАЦИТІВСЬКИЙ'),
	('ЛУГАНСЬКІЙ', 'БРЯНКІВСЬКИЙ'): (Region.LUHANSK, 'БРЯНКІВСЬКИЙ'),
	('ЛУГАНСЬКІЙ', 'КРАСНОДОНСЬКИЙ'): (Region.LUHANSK, 'КРАСНОДОНСЬКИЙ'),
	('ЛУГАНСЬКІЙ', 'КРАСНОЛУЦЬКИЙ'): (Region.LUHANSK, 'КРАСНОЛУЦЬКИЙ'),
	('ЛУГАНСЬКІЙ', 'КІРОВСЬКИЙ'): (Region.LUHANSK, 'КІРОВСЬКИЙ'),
	('ЛУГАНСЬКІЙ', 'ЛУГАНСЬКЕ'): (Region.LUHANSK, 'ЛУГАНСЬКЕ'),
	('ЛУГАНСЬКІЙ', 'ЛУГАНСЬКОГО'): (Region.LUHANSK, 'ЛУГАНСЬКОГО'),
	('ЛУГАНСЬКІЙ', 'ЛУГАНСЬКІЙ'): (Region.LUHANSK, 'ЛУГАНСЬКІЙ'),
	('ЛУГАНСЬКІЙ', 'ЛУТУГИНСЬКИЙ'): (Region.LUHANSK, 'ЛУТУГИНСЬКИЙ'),
	('ЛУГАНСЬКІЙ', 'ПЕРВОМАЙСЬКИЙ'): (Region.LUHANSK, 'ПЕРВОМАЙСЬКИЙ'),
	('ЛУГАНСЬКІЙ', 'ПЕРЕВАЛЬСЬКИЙ'): (Region.LUHANSK, 'ПЕРЕВАЛЬСЬКИЙ'),
	('ЛУГАНСЬКІЙ', 'РОВЕНЬКІВСЬКИЙ'): (Region.LUHANSK, 'РОВЕНЬКІВСЬКИЙ'),
	('ЛУГАНСЬКІЙ', 'СВЕРДЛОВСЬКИЙ'): (Region.LUHANSK, 'СВЕРДЛОВСЬКИЙ'),
	('ЛУГАНСЬКІЙ', 'СЛОВ’ЯНОСЕРБСЬКИЙ'): (Region.LUHANSK, 'СЛОВ’ЯНОСЕРБСЬКИЙ'),
	('ЛУГАНСЬКІЙ', 'СТАХАНОВСЬКИЙ'): (Region.LUHANSK, 'СТАХАНОВСЬКИЙ'),
	('ЛЬВІВСЬКІЙ', 'ДРОГОБИЦЬКОГО'): (Region.LVIV, 'ДРОГОБИЦЬКОГО'),
	('ЛЬВІВСЬКІЙ', 'ЗОЛОЧІВСЬКОГО'): (Region.LVIV, 'ЗОЛОЧІВСЬКОГО'),
	('ЛЬВІВСЬКІЙ', 'КАМ’ЯНКА-БУЗЬКОГО'): (Region.LVIV, 'КАМ’ЯНКА-БУЗЬКОГО'),
	('ЛЬВІВСЬКІЙ', 'ЛЬВІВСЬКІЙ'): (Region.LVIV, 'ЛЬВІВСЬКІЙ'),
	('ЛЬВІВСЬКІЙ', 'ПУСТОМИТІВСЬКОГО'): (Region.LVIV, 'ПУСТОМИТІВСЬКОГО'),
	('ЛЬВІВСЬКІЙ', 'САМБІРСЬКОГО'): (Region.LVIV, 'САМБІРСЬКОГО'),
	('ЛЬВІВСЬКІЙ', 'СТРИЙСЬКОГО'): (Region.LVIV, 'СТРИЙСЬКОГО'),
	('ЛЬВІВСЬКІЙ', 'ЧЕРВОНОГРАДСЬКОГО'): (Region.LVIV, 'ЧЕРВОНОГРАДСЬКОГО'),
	('ЛЬВІВСЬКІЙ', 'ЯВОРІВСЬКОГО'): (Region.LVIV, 'ЯВОРІВСЬКОГО'),
	('МИКОЛАЇВСЬКІЙ', 'БРАТСЬКОГО'): (Region.MUKOLAIV, 'БРАТСЬКОГО'),
	('МИКОЛАЇВСЬКІЙ', 'ВОЗНЕСЕНСЬКОГО'): (Region.MUKOLAIV, 'ВОЗНЕСЕНСЬКОГО'),
	('МИКОЛАЇВСЬКІЙ', 'ВРАДІЇВСЬКОГО'): (Region.MUKOLAIV, 'ВРАДІЇВСЬКОГО'),
	('МИКОЛАЇВСЬКІЙ', 'КОРАБЕЛЬНОГО'): (Region.MUKOLAIV, 'КОРАБЕЛЬНОГО'),
	('МИКОЛАЇВСЬКІЙ', 'МИКОЛАЇВСЬКІЙ'): (Region.MUKOLAIV, 'МИКОЛАЇВСЬКІЙ'),
	('МИКОЛАЇВСЬКІЙ', 'ОЧАКІВСЬКОГО'): (Region.MUKOLAIV, 'ОЧАКІВСЬКОГО'),
	('МИКОЛАЇВСЬКІЙ', 'ПЕРВОМАЙСЬКОГО'): (Region.MUKOLAIV, 'ПЕРВОМАЙСЬКОГО'),
	('ОДЕСЬКІЙ', 'БАЛТСЬКОГО'): (Region.ODESA, 'БАЛТСЬКОГО'),
	('ОДЕСЬКІЙ', 'БІЛЯЇВСЬКОГО'): (Region.ODESA, 'БІЛЯЇВСЬКОГО'),
	('ОДЕСЬКІЙ', 'ЛИМАНСЬКОГО'): (Region.ODESA, 'ЛИМАНСЬКОГО'),
	('ОДЕСЬКІЙ', 'ОВІДІОПОЛЬСЬКОГО'): (Region.ODESA, 'ОВІДІОПОЛЬСЬКОГО'),
	('ОДЕСЬКІЙ', 'ОДЕСЬКІЙ'): (Region.ODESA, 'ОДЕСЬКІЙ'),
	('ОДЕСЬКІЙ', 'ОДЕСІ'): (Region.ODESA, 'ОДЕСІ'),
	('ОДЕСЬКІЙ', 'ІЗМАЇЛЬСЬКОГО'): (Region.ODESA, 'ІЗМАЇЛЬСЬКОГО'),
	('ПОЛТАВСЬКІЙ', 'КОБЕЛЯЦЬКОГО'): (Region.POLTAVA, 'КОБЕЛЯЦЬКОГО'),
	('ПОЛТАВСЬКІЙ', 'КРЕМЕНЧУЦЬКОГО'): (Region.POLTAVA, 'КРЕМЕНЧУЦЬКОГО'),
	('ПОЛТАВСЬКІЙ', 'ПОЛТАВСЬКОГО'): (Region.POLTAVA, 'ПОЛТАВСЬКОГО'),
	('ПОЛТАВСЬКІЙ', 'ПОЛТАВСЬКІЙ'): (Region.POLTAVA, 'ПОЛТАВСЬКІЙ'),
	('ПОЛТАВСЬКІЙ', 'ПОЛІЦІЇ №2 КРЕМЕНЧУЦЬКОГО'): (Region.POLTAVA, 'ПОЛІЦІЇ №2 КРЕМЕНЧУЦЬКОГО'),
	('РІВНЕНСЬКІЙ', 'CАРНЕНСЬКОГО'): (Region.RIVNE, 'CАРНЕНСЬКОГО'),
	('РІВНЕНСЬКІЙ', 'ВАРАШСЬКОГО'): (Region.RIVNE, 'ВАРАШСЬКОГО'),
	('РІВНЕНСЬКІЙ', 'ДУБЕНСЬКОГО'): (Region.RIVNE, 'ДУБЕНСЬКОГО'),
	('РІВНЕНСЬКІЙ', 'КОСТОПІЛЬСЬКОГО'): (Region.RIVNE, 'КОСТОПІЛЬСЬКОГО'),
	('РІВНЕНСЬКІЙ', 'ОСТРОЗЬКОГО'): (Region.RIVNE, 'ОСТРОЗЬКОГО'),
	('РІВНЕНСЬКІЙ', 'РІВНЕНСЬКОГО'): (Region.RIVNE, 'РІВНЕНСЬКОГО'),
	('РІВНЕНСЬКІЙ', 'РІВНЕНСЬКІЙ'): (Region.RIVNE, 'РІВНЕНСЬКІЙ'),
	('РІВНЕНСЬКІЙ', 'САРНЕНСЬКОГО'): (Region.RIVNE, 'САРНЕНСЬКОГО'),
	('СУМСЬКІЙ', 'ГЛУХІВСЬКОГО'): (Region.SYMU, 'ГЛУХІВСЬКОГО'),
	('СУМСЬКІЙ', 'ОХТИРСЬКОГО'): (Region.SYMU, 'ОХТИРСЬКОГО'),
	('СУМСЬКІЙ', 'СУМСЬКОГО РАЙОННОГО'): (Region.SYMU, 'СУМСЬКОГО РАЙОННОГО'),
	('СУМСЬКІЙ', 'СУМСЬКІЙ'): (Region.SYMU, 'СУМСЬКІЙ'),
	('СУМСЬКІЙ', 'ШОСТКИНСЬКОГО'): (Region.SYMU, 'ШОСТКИНСЬКОГО'),
	('ТЕРНОПІЛЬСЬКІЙ', 'ПІДВОЛОЧИСЬКОГО'): (Region.TERNOPIL, 'ПІДВОЛОЧИСЬКОГО'),
	('ТЕРНОПІЛЬСЬКІЙ', 'ТЕРЕБОВЛЯНСЬКОГО'): (Region.TERNOPIL, 'ТЕРЕБОВЛЯНСЬКОГО'),
	('ТЕРНОПІЛЬСЬКІЙ', 'ТЕРНОПІЛЬСЬКОГО'): (Region.TERNOPIL, 'ТЕРНОПІЛЬСЬКОГО'),
	('ТЕРНОПІЛЬСЬКІЙ', 'ТЕРНОПІЛЬСЬКІЙ'): (Region.TERNOPIL, 'ТЕРНОПІЛЬСЬКІЙ'),
	('ТЕРНОПІЛЬСЬКІЙ', 'ЧОРТКІВСЬКОГО'): (Region.TERNOPIL, 'ЧОРТКІВСЬКОГО'),
	('ХАРКІВСЬКІЙ', 'ХАРКІВСЬКОГО'): (Region.CHARKIV, 'ХАРКІВСЬКОГО'),
	('ХАРКІВСЬКІЙ', 'ХАРКІВСЬКІЙ'): (Region.CHARKIV, 'ХАРКІВСЬКІЙ'),
	('ХЕРСОНСЬКОЇ', 'ХЕРСОНСЬКОЇ'): (Region.HERSON, 'ХЕРСОНСЬКОЇ'),
	('ХЕРСОНСЬКІЙ', 'БЕРИСЛАВСЬКОГО'): (Region.HERSON, 'БЕРИСЛАВСЬКОГО'),
	('ХЕРСОНСЬКІЙ', 'ГЕНІЧЕСЬКОГО'): (Region.HERSON, 'ГЕНІЧЕСЬКОГО'),
	('ХЕРСОНСЬКІЙ', 'КАХОВСЬКОГО'): (Region.HERSON, 'КАХОВСЬКОГО'),
	('ХЕРСОНСЬКІЙ', 'НОВОКАХОВСЬКОГО'): (Region.HERSON, 'НОВОКАХОВСЬКОГО'),
	('ХЕРСОНСЬКІЙ', 'ХЕРСОНСЬКОГО'): (Region.HERSON, 'ХЕРСОНСЬКОГО'),
	('ХЕРСОНСЬКІЙ', 'ХЕРСОНСЬКІЙ'): (Region.HERSON, 'ХЕРСОНСЬКІЙ'),
	('ХМЕЛЬНИЦЬКІЙ', 'ГОРОДОЦЬКОГО'): (Region.KHMELNUTSKA, 'ГОРОДОЦЬКОГО'),
	('ХМЕЛЬНИЦЬКІЙ', 'ХМЕЛЬНИЦЬКІЙ'): (Region.KHMELNUTSKA, 'ХМЕЛЬНИЦЬКІЙ'),
	('ЧЕРКАСЬКІЙ', 'ЗОЛОТОНІСЬКОГО'): (Region.CHERKASU, 'ЗОЛОТОНІСЬКОГО'),
	('ЧЕРКАСЬКІЙ', 'УМАНСЬКОГО'): (Region.CHERKASU, 'УМАНСЬКОГО'),
	('ЧЕРКАСЬКІЙ', 'ЧЕРКАСЬКІЙ'): (Region.CHERKASU, 'ЧЕРКАСЬКІЙ'),
	('ЧЕРНІВЕЦЬКІЙ', 'КЕЛЬМЕНЕЦЬКОГО'): (Region.CHERNIVETSKA, 'КЕЛЬМЕНЕЦЬКОГО'),
	('ЧЕРНІВЕЦЬКІЙ', 'КІЦМАНСЬКОГО'): (Region.CHERNIVETSKA, 'КІЦМАНСЬКОГО'),
	('ЧЕРНІВЕЦЬКІЙ', 'СТОРОЖИНЕЦЬКОГО'): (Region.CHERNIVETSKA, 'СТОРОЖИНЕЦЬКОГО'),
	('ЧЕРНІВЕЦЬКІЙ', 'ЧЕРНІВЕЦЬКОГО'): (Region.CHERNIVETSKA, 'ЧЕРНІВЕЦЬКОГО'),
	('ЧЕРНІВЕЦЬКІЙ', 'ЧЕРНІВЕЦЬКІЙ'): (Region.CHERNIVETSKA, 'ЧЕРНІВЕЦЬКІЙ'),
	('ЧЕРНІГІВСЬКІЙ', 'МЕНСЬКОГО'): (Region.CHERNIHIV, 'МЕНСЬКОГО'),
	('ЧЕРНІГІВСЬКІЙ', 'НІЖИНСЬКОГО'): (Region.CHERNIHIV, 'НІЖИНСЬКОГО'),
	('ЧЕРНІГІВСЬКІЙ', 'ЧЕРНІГІВСЬКІЙ'): (Region.CHERNIHIV, 'ЧЕРНІГІВСЬКІЙ'),
	('ІВАНО-ФРАНКІВСЬКІЙ', 'КАЛУСЬКОГО'): (Region.IF, 'КАЛУСЬКОГО'),
	('ІВАНО-ФРАНКІВСЬКІЙ', 'КОЛОМИЙСЬКОГО'): (Region.IF, 'КОЛОМИЙСЬКОГО'),
	('ІВАНО-ФРАНКІВСЬКІЙ', 'КОСІВСЬКОГО'): (Region.IF, 'КОСІВСЬКОГО'),
	('ІВАНО-ФРАНКІВСЬКІЙ', 'НАДВІРНЯНСЬКОГО'): (Region.IF, 'НАДВІРНЯНСЬКОГО'),
	('ІВАНО-ФРАНКІВСЬКІЙ', 'ТИСМЕНИЦЬКОГО'): (Region.IF, 'ТИСМЕНИЦЬКОГО'),
	('ІВАНО-ФРАНКІВСЬКІЙ', 'ІВАНО-ФРАНКІВСЬКІЙ'): (Region.IF,  'ІВАНО-ФРАНКІВСЬКІЙ'),
	(None, 'АЛУШТИНСЬКИЙ'): (Region.KRUM, 'АЛУШТИНСЬКИЙ'),
	(None, 'АРМЯНСЬКИЙ'): (Region.KRUM, 'АРМЯНСЬКИЙ'),
	(None, 'БАХЧИСАРАЙСЬКИЙ'): (Region.KRUM, 'БАХЧИСАРАЙСЬКИЙ'),
	(None, 'БЄЛОГІРСЬКИЙ'): (Region.KRUM, 'БЄЛОГІРСЬКИЙ'),
	(None, 'ВОЛИНСЬКІЙ'): (Region.VOLUNSKA, 'ВОЛИНСЬКІЙ'),
	(None, 'ВІННИЦЬКІЙ'): (Region.VINNUTSIA, 'ВІННИЦЬКІЙ'),
	(None, 'ГОРЛІВСЬКОГО'): (Region.DONETSK, 'ГОРЛІВСЬКОГО'),
	(None, 'ДЖАНКОЛЙСЬКИЙ'): (Region.KRUM, 'ДЖАНКОЛЙСЬКИЙ'),
	(None, 'ДОНЕЦЬКІЙ'): (Region.DONETSK, 'ДОНЕЦЬКІЙ'),
	(None, 'ЗАЛІЗНИЧНИЙ РВ СІМФЕРОПОЛЬСЬКОГО'): (Region.KRUM, 'ЗАЛІЗНИЧНИЙ РВ СІМФЕРОПОЛЬСЬКОГО'),
	(None, 'КЕРЧЕНСЬКЕ'): (Region.KRUM, 'КЕРЧЕНСЬКЕ'),
	(None, 'КИЄВІ'): (Region.KUIV, 'КИЄВІ'),
	(None, 'КИЇВСЬКИЙ РВ СІМФЕРОПОЛЬСЬКОГО'): (Region.KRUM, 'КИЇВСЬКИЙ РВ СІМФЕРОПОЛЬСЬКОГО'),
	(None, 'КИЇВСЬКІЙ'): (Region.KUIV, 'КИЇВСЬКІЙ'),
	(None, 'КРАСНОВГАРДІЙСЬКИЙ'): (Region.KRUM, 'КРАСНОВГАРДІЙСЬКИЙ'),
	(None, 'КРАСНОПЕРЕКОПСЬКИЙ'): (Region.KRUM, 'КРАСНОПЕРЕКОПСЬКИЙ'),
	(None, 'КІРОВОГРАДСЬКІЙ'): (Region.KIROVOGRAD, 'КІРОВОГРАДСЬКІЙ'),
	(None, 'КІРОВСЬКИЙ'): (Region.DONETSK, 'КІРОВСЬКИЙ'),
	(None, 'ЛЕНІНСЬКИЙ'): (Region.LUHANSK, 'ЛЕНІНСЬКИЙ'),
	(None, 'ЛУГАНСЬКІЙ'): (Region.LUHANSK, 'ЛУГАНСЬКІЙ'),
	(None, 'НИЖНЬОГІРСЬКИЙ'): (Region.KRUM, 'НИЖНЬОГІРСЬКИЙ'),
	(None, 'ОДЕСЬКІЙ'): (Region.ODESA, 'ОДЕСЬКІЙ'),
	(None, 'ПЕРШОМАЙСЬКИЙ'): (Region.KRUM, 'ПЕРШОМАЙСЬКИЙ'),
	(None, 'ПОЛТАВСЬКІЙ'): (Region.POLTAVA, 'ПОЛТАВСЬКІЙ'),
	(None, 'РІВНЕНСЬКІЙ'): (Region.RIVNE, 'РІВНЕНСЬКІЙ'),
	(None, 'САКСЬКИЙ'): (Region.KRUM, 'САКСЬКИЙ'),
	(None, 'СЕВАСТОПОЛЬСЬКОГО'): (Region.KRUM, 'СЕВАСТОПОЛЬСЬКОГО'),
	(None, 'СЕВАСТОПОЛІ'): (Region.KRUM, 'СЕВАСТОПОЛІ'),
	(None, 'СЕВАСТПОЛЬСЬКОГО'): (Region.KRUM, 'СЕВАСТПОЛЬСЬКОГО'),
	(None, 'СОВЄТСЬКИЙ'): (Region.DONETSK, 'СОВЄТСЬКИЙ'),
	(None, 'СУДАЦЬКИЙ'): (Region.KRUM, 'СУДАЦЬКИЙ'),
	(None, 'СІМФЕРОПОЛЬ'): (Region.KRUM, 'СІМФЕРОПОЛЬ'),
	(None, 'СІМФЕРОПОЛЬСЬКИЙ'): (Region.KRUM, 'СІМФЕРОПОЛЬСЬКИЙ'),
	(None, 'ФЕОДОСІЙСЬКЕ'): (Region.KRUM, 'ФЕОДОСІЙСЬКЕ'),
	(None, 'ХЕРСОНСЬКІЙ'): (Region.HERSON, 'ХЕРСОНСЬКІЙ'),
	(None, 'ЦЕНТРАЛЬНИЙ РВ СІМФЕРОПОЛЬСЬКОГО'): (Region.KRUM, 'ЦЕНТРАЛЬНИЙ РВ СІМФЕРОПОЛЬСЬКОГО'),
	(None, 'ЧОРНОМОРСЬКИЙ'): (Region.KRUM, 'ЧОРНОМОРСЬКИЙ'),
	(None, 'ЯЛТИНСЬКЕ МУ СІМФЕРОПОЛЬСЬКОГО'): (Region.KRUM, 'ЯЛТИНСЬКЕ МУ СІМФЕРОПОЛЬСЬКОГО'),
	(None, 'ЄВПАТОРІЙСЬКЕ'): (Region.KRUM, 'ЄВПАТОРІЙСЬКЕ'),
	(None, 'ІВАНО-ФРАНКІВСЬКОЇ'): (Region.IF, 'ІВАНО-ФРАНКІВСЬКОЇ'),
}
In [ ]:
df[["region", "city"]] = df[["region", "city"]].apply(
	lambda row: m[(row.region, row.city)], axis=1
).to_list()
df

Стартові питання до набору даних:¶

  • В яких регіонах зафіксована найбільша кількість безвісно зниклих осіб?
  • Як розподіляються безвісно зниклі за роком зникнення та регіоном?
  • Як розподіляються безвісно зниклі за роком зникнення, регіоном та статтю?
  • Як розподіляються безвісно зниклі за роком народження або віком на момент зникнення та статтю?
  • Як розподіляються безвісно зниклі за роком або ж роком і місяцем зникнення та статтю?

Відповіді на запитання¶

Як розподіляються безвісно зниклі за роком народження або віком на момент зникнення та статтю?¶

In [21]:
import numpy as np
In [22]:
input_data = df[["AGE", "SEX"]]

bins = [0, 14, 24, 50, 65, np.ceil(df.AGE.max())]
labels = ['0-14', '14-24', '24-50', '50-65', f'65-{int(np.ceil(df.AGE.max()))}']
index = input_data.SEX == "ЖІНОЧА"
input_data.loc[index, 'AGE_CATEGORY'] = pd.cut(x=input_data[index].AGE, bins=bins, labels=labels, include_lowest=True)
input_data.loc[~index, 'AGE_CATEGORY'] = pd.cut(x=input_data[~index].AGE, bins=bins, labels=labels, include_lowest=True)
input_data = input_data.groupby(by=["SEX", 'AGE_CATEGORY'])["SEX", 'AGE_CATEGORY'].value_counts().reset_index() #.value_counts().reset_index()
input_data.rename(columns={0: "amount"}, inplace=True)
/tmp/ipykernel_37209/3747435891.py:6: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  input_data.loc[index, 'AGE_CATEGORY'] = pd.cut(x=input_data[index].AGE, bins=bins, labels=labels, include_lowest=True)
/tmp/ipykernel_37209/3747435891.py:8: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
  input_data = input_data.groupby(by=["SEX", 'AGE_CATEGORY'])["SEX", 'AGE_CATEGORY'].value_counts().reset_index() #.value_counts().reset_index()
In [23]:
# Як розподіляються безвісно зниклі за роком народження або віком на момент зникнення та статтю?

alt.Chart(input_data).mark_bar().encode(
    x=alt.X("AGE_CATEGORY:O"),
    y=alt.Y("amount:Q"),
    column=alt.Column("SEX:N"),
    color=alt.Color("SEX:N"),
).properties(width=300, height=600)
Out[23]:

Як розподіляються безвісно зниклі за роком зникнення, регіоном та статтю?¶

In [81]:
year_brush = alt.selection_interval(encodings=["x"], empty="all",)
input_dropdown = alt.binding_select(options=[True, False], name='Was war?')
selection = alt.selection_single(fields=['was_war'], bind=input_dropdown)

pt_chart = alt.Chart(df).mark_bar().encode(
    x=alt.X("LOST_DATE:T"),
    y=alt.Y("count():Q", scale=alt.Scale(exponent=10)),
    # color=alt.Color("NAME_1:N"),
).add_selection(
    year_brush
).add_selection(selection).transform_filter(selection)

detail_pt_chart = alt.Chart(df).mark_bar().encode(
    x=alt.X("LOST_DATE:T"),
    y=alt.Y("count():Q", scale=alt.Scale(exponent=10)),
).transform_filter(year_brush).transform_filter(selection)

gender_chart = alt.Chart(df).mark_bar().encode(
    x=alt.X("count():Q"),
    y=alt.Y("AGE:Q", bin=True),
    row = alt.Row("SEX:N"),
    color = alt.Color("SEX:N"),
).transform_filter(year_brush).transform_filter(selection)
In [82]:
(detail_pt_chart.properties(width=600, height=300) &  pt_chart.properties(width=600, height=100)) | gender_chart.properties(width=200, height=200)
Out[82]:

Export до html¶

In [27]:
! jupyter nbconvert --to html project.ipynb
! mv project.html index.html
[NbConvertApp] Converting notebook project.ipynb to html
[NbConvertApp] Writing 772744 bytes to project.html
In [ ]: